// 敌方直升机类：实现AI控制的敌方直升机，具有路径跟随和自动攻击功能
class EnemyChopper extends Chopper {

    // 构造函数：初始化敌方直升机
    constructor() {
        // 默认朝向左边（-1）
        super(-1);

        // 添加到敌方直升机分类桶
        this.buckets.push('enemy-chopper');

        // 路径跟随相关
        this.reachedTarget = false;  // 是否到达目标点
        this.path = [];              // 路径点数组

        // 锁定警告音效相关
        this.lastWarningBeep = 0;    // 上次警告音效时间

        // 扩大目标保持角度范围为180度
        this.lockedTargetKeepAngle = PI;
    }

    // 设置直升机的路径
    // @param path: 路径点数组
    // @returns: this，用于链式调用
    follow(path) {
        this.path = path;
        return this;
    }

    // 渲染敌方直升机
    // @param camera: 当前相机实体
    render(camera) {
        ctx.wrap(() => {
            // 只在有锁定目标时渲染锁定指示器
            if (this.lockedTargetFactor <= 0) return;

            ctx.translate(this.x, this.y);

            // 计算重复的锁定动画因子（0-1循环）
            const repeatedLockFactor = (this.lockedTargetFactor % 0.25) / 0.25;

            // 渲染红色锁定指示圈
            ctx.fillStyle = '#f00';
            ctx.globalAlpha = interpolate(1, 0, repeatedLockFactor);

            // 缩放动画
            const s = interpolate(0, 1, repeatedLockFactor);
            ctx.scale(s, s);

            // 绘制圆形指示器
            ctx.beginPath();
            ctx.arc(0, 0, 150, 0, PI * 2);
            ctx.fill();
        });

        // 调用父类渲染方法
        super.render(camera);
    }

    // 更新敌方直升机状态
    // @param elapsed: 经过的时间
    cycle(elapsed) {
        super.cycle(elapsed);

        // 重置控制状态
        this.controls.up = false;
        this.controls.left = false;
        this.controls.right = false;

        // 获取当前目标点
        const target = this.path[0]
        if (!target) return;

        // 计算到目标点的距离
        const distToTarget = dist(target, this);

        if (distToTarget > 10) {
            // 如果距离目标点超过10个单位，进行移动
            const future = this.futurePosition();
            // 根据预测位置调整左右移动
            this.controls.right = future.x < target.x - 10;
            this.controls.left = future.x > target.x + 10;
            // 根据高度差调整上升
            this.controls.up = future.y > target.y;
        } else {
            // 到达目标点，将当前目标点移到路径末尾
            this.path.push(this.path.shift());
        }

        // 锁定目标时自动射击
        this.controls.shoot = this.lockedTargetFactor >= 1;

        // 播放锁定警告音效
        if (this.lockedTargetFactor > 0 && this.age - this.lastWarningBeep > 0.2) {
            this.lastWarningBeep = this.age;
            sound(...[.4,,434,,.03,.01,3,2,,5,,,,,168,,,.76,.03,,520]); // Blip 639
        }
    }
}
